#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logs, time, pysvn

from subprocess import Popen, PIPE

from ..lib.plugin import MeliponiniPlugin
from ..lib.config import Config
from ..lib.utils import Utils

config = Config()

def log(s):
    logs.log(s)


class plugin(MeliponiniPlugin):
    def constructor(self, method):
        self.directory = config.get('dirs.svn')
        
        if method == 'get':
            self.addHTTPHandler('/svn/list/', self.commandList)
            self.addHTTPHandler('/svn/backup/', self.commandBackup)
            
        self.addTimer(3600, self.timerCheckFilesUpdated)
        
        
    '''
    TIMER checkFilesUpdated
    
    Comprueba periódicamente que los ficheros de la copia local en el servidor
    están añadidos al repositorio y subidos.
    
    Para ello se debe buscar en el directorio www (ver config) todos los
    directorios con el subdirectorio .svn, y hacer una búsqueda recursiva de
    ficheros que no estén en el repositorio. En caso de encontrar alguno, se
    hace "svn add", y al final del proceso "svn commit".
    
    Esto es útil para añadir las imágenes uploaded en el servidor de producción,
    teniéndolas en la copia local de desarrollo.
    '''
    def timerCheckFilesUpdated(self):
        return


    '''
    /svn/list/
    Solicitan un listado de repositorios subversion
    '''
    def commandList(self):
        # respuesta json
        self.responseJSON( Utils().listdirs( self.directory ) )

    
    '''
    /svn/backup/{svnname}/
    Solicitan una copia de seguridad de un repositorio subversion
    '''
    def commandBackup(self):
        # path = /svn/backup/dirname/
        dir = self.path.split('/')[3]
        source = self.directory + '/' + dir
        target = dir + '-' + time.strftime("%Y%m%d%H%M%S", time.localtime()) + '.tar.bz2'
        
        # enviamos datos
        self.responseFile( Utils().compressdir(source), target, 'application/x-bzip2' )
        
        
    '''
    GET /svn/create/{svnname}/
    Solicitan crear un nuevo repositorio subversion
    '''
    def commandCreate(self):
        svnname = self.path.split('/')[3]
        # ejecutamos: sudo -u www-data svnadmin create /var/svn/{svnname}
        Popen(['sudo', '-u', 'www-data', 'svnadmin', 'create', self.directory + '/' + svnname])
        # respuesta json
        self.responseJSON( Utils().listdirs( self.config.SVN_DIR ) )
        
    
    '''
    /svn/checkout/{svnname}/[wwwdirname]/
    Solicitan hacer un checkout en www de un repositorio svn local
    '''
    def commandSvnCheckout(self):
        return
    
    '''
    /svn/update/{wwwdirname}/
    Realizamos un update a una copia local de subversion en el directorio de webs
    '''
    def commandSvnUpdate(self):
        return
    
